#include "bsp_max31856.h"
#include "math.h"
#include "stdint.h"
#include "spi.h"

uint8_t uch_cr0,uch_cr1,uch_mask;
/**
  * 函数功能: SPI读取数据
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
*/
uint8_t MAX31856_SB_Read(uint8_t *buffer, uint8_t nBytes)
{
	uint8_t txdata=0;

	HAL_SPI_TransmitReceive(&hspi1, &txdata, buffer,nBytes, 0xFFFF);

  return(0);
}

/**
  * 函数功能: SPI写一个字节
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
*/
uint8_t MAX31856_Write_Byte(uint8_t data)
{

	HAL_SPI_Transmit(&hspi1,&data,1,0xFFFF);

	return(0);
}

/**
  * 函数功能: SPI读取一字节内容
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
*/
uint8_t MAX31856_Read_Byte(void)
{

	uint8_t data=0xff;
	uint8_t redata=0;
	HAL_SPI_TransmitReceive(&hspi1, &data, &redata,1, 0xFFFF);
	return redata;
}

/**
  * 函数功能: MAX31856写寄存器内容
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
*/
void MAX31856_Write_Register(uint8_t uch_register_address, uint8_t uch_register_value)
{
  MAX31856_CS_ENABLE();
  MAX31856_Write_Byte(uch_register_address);
  MAX31856_Write_Byte(uch_register_value);
  MAX31856_CS_DISABLE(); 
}

/**
  * 函数功能: MAX31856读取寄存器内容
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
*/
uint8_t MAX31856_Read_Register(uint8_t uch_register_address)
{
  uint8_t uch_register_data;
  
  MAX31856_CS_ENABLE();
  MAX31856_Write_Byte(uch_register_address);
  uch_register_data=MAX31856_Read_Byte();
  MAX31856_CS_DISABLE();
  return (uch_register_data);
  
}

/**
  * 函数功能: MAX31856读取多个寄存器内容
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
*/
void MAX31856_Read_Nregisters(uint8_t uch_register_address, uint8_t *uch_buff,uint8_t uch_nBytes)
{
 MAX31856_CS_ENABLE();
 MAX31856_Write_Byte(uch_register_address);
 MAX31856_SB_Read(uch_buff,uch_nBytes);
 MAX31856_CS_DISABLE();
}

/**
  * 函数功能: MAX31856初始化配置
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
*/
void MAX31856_Init(void)
{  //使能故障检测，选择50Hz滤波   故障模式采用中断模式
   uch_cr0= OC_Fault_Enable_1|NRF_50Hz| Interrupt_Mode; //配置CR0
   //由于采用单次测量模式，因此设置每次测量输出结果。热电偶选择K型热电偶
   uch_cr1&= Average_1_Bit ;
   uch_cr1|=TC_TypeK;
   //由于使能故障检测，因此，不屏蔽任何的故障检测，可以根据要求选择屏蔽掉不需要检测的故障
   uch_mask=No_Fault_Mask ;  
   
   MAX31856_Write_Register(0x80, uch_cr0);   //设置CR0
   MAX31856_Write_Register(0x81, uch_cr1);  //配置CR1
   MAX31856_Write_Register(0x82,uch_mask);  //配置MASK
   
    //写冷端故障门限寄存器，可根据需要设置
   MAX31856_Write_Register(0x83,0x7F);
   MAX31856_Write_Register(0x84,0xC0);
   //写热电偶故障门限寄存器，可根据需要设置
   MAX31856_Write_Register(0x85,0x7F);
   MAX31856_Write_Register(0x86,0xFF);
   MAX31856_Write_Register(0x87,0x80);
   MAX31856_Write_Register(0x88,0x00);
   //写冷端温度失调寄存器，可根据需要设置
   MAX31856_Write_Register(0x89,0x00);
   //如果禁止使用器件内部冷端补偿，写冷端温度寄存器，可根据需要设置
   //如果采用外部冷端温度传感器测量冷端温度，需要在每次测量冷端温度后更新
   //冷端温度寄存器。
   MAX31856_Write_Register(0x8A,0x00);
   MAX31856_Write_Register(0x8B,0x00);
  
}

/**
  * 函数功能: MAX31856停止转换
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
*/
void MAX31856_Stop_Conversion(void)
{
  uch_cr0= MAX31856_Read_Register(0x00);
  uch_cr0&=Stop_Conversion_Bit;
  MAX31856_Write_Register(0x80, uch_cr0);
}

/**
  * 函数功能: MAX31856开启转换
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
*/
void MAX31856_Start_Conversion(uint8_t uch_conversion_mode)  
{
 uch_cr0=MAX31856_Read_Register(0x00);
 uch_cr0&=Stop_Conversion_Bit;
 uch_cr0|=uch_conversion_mode;
 MAX31856_Write_Register(0x80, uch_cr0);
}

/**
  * 函数功能: MAX31856读失能故障状态
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
*/
void MAX31856_Disable_Oc_Fault_Detection(void)
{
 uch_cr0= MAX31856_Read_Register(0x00);
 uch_cr0&=OC_Fault_Disable_Bit;
 MAX31856_Write_Register(0x80, uch_cr0);
}

/**
  * 函数功能: MAX31856读设置故障状态
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
*/
void MAX31856_Set_Oc_Fault_Detection(uint8_t uch_oc_fault_enable)
{
 uch_cr0= MAX31856_Read_Register(0x00);
 uch_cr0&=OC_Fault_Disable_Bit;
 uch_cr0|=uch_oc_fault_enable;
 MAX31856_Write_Register(0x80, uch_cr0);
}

/**
  * 函数功能: MAX31856清除故障状态
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
*/
void MAX31856_Clear_Fault_Status(void)
{
 uch_cr0= MAX31856_Read_Register(0x00);
 uch_cr0|= Fault_Clear ;
 MAX31856_Write_Register(0x80, uch_cr0);
}





